#include <iostream>
using namespace std;

#define maxSize 30

typedef int ElemType;

// 线性表的定义
struct SqList {
	ElemType *elem;		// 线性表的表头
	int length;			// 线性表的长度
};

// 线性表初始化
bool InitList(SqList &L)
{
	L.elem = (ElemType *) malloc(maxSize * sizeof(ElemType));
	if (!L.elem)	// 分配内存失败
		return false;
	L.length = 0;
	return true;
}

// 线性表的销毁
void DestroyList(SqList &L)
{
	free(L.elem);
	L.elem = NULL;
	L.length = 0;
}

// 线性表的清空
void CLearList(SqList &L)
{
	L.length = 0;
}

// 判断线性表是否为空
bool IsEmpty(SqList L)
{
	if (L.length == 0)
		return true;
	else
		return false;
}

// 返回线性表的长度
int ListLength(SqList L)
{
	return L.length;
}

// 线性表的取值	 用e返回L中第i个数据元素的值
bool GetElem(SqList L, int i, ElemType &e)
{
	if (i < 1 || i > L.length)
		return false;
	e = *(L.elem + i - 1);
	return true;
}

// 线性表的查找
int LocateElem(SqList L, ElemType e)
{
	int i;
	for (i = 0; i < L.length; i++)
	{
		if (L.elem[i] == e)
			return i + 1;	// 查找成功，返回下标值 因为下标从0开始，所以加1
	}
	return 0;	
}

// 线性表的插入
bool InsertList(SqList &L, ElemType e, int i)
{
	if (L.length == maxSize)
	{
		cout << "不能插入元素了" << endl;
		return false;
	}
	if (i < 0 || i > maxSize)
	{
		cout << "插入的位置不对" << endl;
		return false;
	}
	if (L.length > 0)
	{
		// 将位于插入位置的后面元素依次后挪一位
		for (int p = L.length - 1; p >= i; p--)
			L.elem[p + 1] = L.elem[p];
	}
	L.elem[i] = e;
	L.length++;
	return true;
}

// 线性表的删除
bool DeleteElem(SqList &L, int i)
{
	if (i < 0 || i > L.length)
	{
		cout << "错误的删除元素的位置" << endl;
		return false;
	}
	if (L.length == 0)
	{
		cout << "没有元素，你叫我怎么删除" << endl;
		return false;
	}
	// 将删除位置之后的元素依次向前挪一位
	for (int p = i + 1; p < L.length; p++)
	{
		L.elem[p - 1] = L.elem[p];
	}
	L.length--;
	return true;
}